/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agenda.entityes;

import java.util.LinkedList;
import java.util.List;

/**
 * Singola voce della rubica.
 *
 * @author emanuele
 */
//FIXME spostare la gestione degli ID dellevoci in AgeDB altrimenti
// ogni volta che si crea un voce il numero maxid aumenta anche se non si salva
public class AgeEntry {



    private static UniqueIdGenerator idGen;
    int ID;
    Type type;
    String name;
    String surname;
    String email;
    String desc;
    LinkedList<TelNumber> numbers = new LinkedList<TelNumber>();
    LinkedList<AgeEntry> associations = new LinkedList<AgeEntry>();
    boolean valid = false;

    public AgeEntry(UniqueIdGenerator idGen, Type t) {
        if (idGen == null)
            throw new IllegalArgumentException("idGenerator non può essere null");
        /* nel caso in cui un idGen sia già stato fornito in precedenza,
         * lancio un errore, perché a seconda di come è implementato il nuovo
         * generatore potrebbero verificarsi delle sovrapposizioni con i numeri
         */
        if (AgeEntry.idGen == null)
            AgeEntry.idGen = idGen;
        else
            throw new IllegalStateException("un idGenerator è già stato impostato in precedenza");

        type = t;

    }

    public int getID(){
        return ID;
    }

    public boolean isValid(){
        return valid;
    }

    public boolean validate(){
        /*
         * verifica che la voce di rubrica sia scritta correttamente e
         * imposta  true la variabile "valid"
         *
         * dopo di che genera l'hash della voce
         */
        ID = hashCode();
        valid = true;
        return valid;
    }

    public AgeEntry(Type t) {
        if (t== null) {
            throw new IllegalArgumentException();
        }
    }

    public AgeEntry(){
    }



    public LinkedList<AgeEntry> getAssociations() {
        return associations;
    }

    public void setAssociations(LinkedList<AgeEntry> associations) {
        if (associations == null) {
            throw new IllegalArgumentException();
        }
        this.associations = associations;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        if (email == null) {
            throw new IllegalArgumentException();
        }
        this.email = email;
    }

    public void setNumbers(LinkedList<TelNumber> numbers) {
        if (numbers == null) {
            throw new IllegalArgumentException();
        }
        this.numbers = numbers;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        if (type == null) {
            throw new IllegalArgumentException();
        }
        this.type = type;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        if (desc == null) {
            throw new IllegalArgumentException();
        }
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name == null) {
            throw new IllegalArgumentException();
        }
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        if (surname == null) {
            throw new IllegalArgumentException();
        }
        this.surname = surname;
    }

    public boolean addNumber(TelNumber n) {
        if (n == null || numbers.contains(n)) {
            return false;
        }
        return numbers.add(n);
    }

    public boolean delNumber(TelNumber n) {
        return numbers.remove(n);
    }

    public List<TelNumber> getNumbers() {
        return numbers;
    }

    public boolean haveThisNumber(TelNumber n) {
        return numbers.contains(n);
    }

    public boolean addAssociation(AgeEntry a) {
        if (associations.contains(a)) {
            return false;
        }
        return associations.add(a);
    }

    public boolean delAssociation(AgeEntry a) {
        return associations.remove(a);
    }

    public void clearAssociations() {
        associations.clear();
    }

        @Override
    public int hashCode() {
        int hash = 3;
        hash = 13 * hash + (this.type != null ? this.type.hashCode() : 0);
        hash = 13 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 13 * hash + (this.surname != null ? this.surname.hashCode() : 0);
        hash = 13 * hash + (this.email != null ? this.email.hashCode() : 0);
        hash = 13 * hash + (this.desc != null ? this.desc.hashCode() : 0);
        return hash;
    }


    @Override
    public boolean equals(Object o) {
        if (o == null) {
            return false;
        }
        if (o instanceof Integer) {
            return ID == ((Integer)o).intValue();
        }
        if (o instanceof AgeEntry) {
            return ID == (((AgeEntry) o).ID);
        }
        return false;
    }

    public boolean containsAssociation(Object o) {
        for (AgeEntry x : associations) {
            if (x.equals(o)) {
                return true;
            }
        }
        return false;


    }

    @Override
    public String toString() {
        if (type == Type.Persona) {
            return surname + " " + name;
        } else {
            return surname;
        }
    }


        public static enum Type {

        Azienda, Persona
    };
}
